// 方法1：把末尾的元素挨个pop，然后unshift到数组前面 | 时间复杂度O(n^2)，空间复杂度O(1)
function rotate1(arr: number[], k: number): number[] {
  const length = arr.length
  if (!k || length === 0) return arr
  const step = Math.abs(k % length) // abs 取绝对值
  for (let i = 0; i < step; i++) {
    const n = arr.pop()
    if (n != null) {
      arr.unshift(n) // 数组是一个有序结构，unshift操作非常慢
    }
  }
  return arr
}

// 方法2：把数组拆分，最后concat拼接到一起 | 时间复杂度O(1)，空间复杂度O(n)
function rotate2(arr: number[], k: number): number[] {
  const length = arr.length
  if (!k || length === 0) return arr
  const step = Math.abs(k % length) // abs 取绝对值
  const part1 = arr.slice(-step)
  const part2 = arr.slice(0, length - step)
  const part3 = part1.concat(part2)
  return part3
}

const arr = [1,2,3,4,5,6,7,8]
const arr1 = rotate1(arr, 3)
console.log(arr1, '返回值');

// 总结：根据前端：重时间，轻空间的要求，所以选择方法2